package com.lagou.zk.config;

import com.lagou.zk.utils.JDBCUtil;
import org.I0Itec.zkclient.IZkDataListener;
import org.I0Itec.zkclient.ZkClient;
import org.springframework.context.annotation.Configuration;
import java.io.IOException;
import java.util.Properties;

@Configuration
public class ZKConfig {

    private static ZkClient zkClient;
    private static final String MYSQL_NODE = "mysqlNode";

    private static void connectZk(String mysqlUrl){
        JDBCUtil.init(mysqlUrl);
        if(!zkClient.exists(prop.getProperty(MYSQL_NODE))){
            // 初始化
            zkClient.createPersistent(prop.getProperty(MYSQL_NODE),mysqlUrl);
        }

        // 注册监听器，监听内容
        zkClient.subscribeDataChanges(prop.getProperty(MYSQL_NODE),new IZkDataListener(){
            @Override
            public void handleDataChange(String path, Object data) throws Exception {
                // 数据变化后的通知处理
                System.out.println(path + "数据变化，新的数据是 " + data);
                connectZk(data.toString());
            }

            @Override
            public void handleDataDeleted(String path) throws Exception {
                System.out.println("数据被删除或者节点被删除时执行");
            }
        });
    }

    private static Properties prop = new Properties();
    // 服务启动时加载配置文件，先根据配置文件创建数据库连接，后续可以根据接口，或者 测试类修改zookeeper中的数据库配置信息创建新的数据库连接池
    static {
        try {
            prop.load(JDBCUtil.class.getClassLoader().getResourceAsStream("druid.properties"));
            zkClient = new ZkClient(prop.getProperty("zkurl"));
            connectZk(prop.getProperty("url"));
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
